package com.tzu.utils;

import java.util.HashMap;
import java.util.regex.Pattern;

/**
 * 正则表达式工具，部分函数采用预编译模式，提高效率
 * @braveheartwzm
 */
public class RegularTools {

    private static final String LINK_TAG = " - ";

    /**
     * 预编译正则表达式对象缓存
     */
    private static final HashMap<String, Pattern> PRE_COMPILE_REGEX_MAP = new HashMap<>();

    /**
     * 验证手机号的正则表达式
     */
    public static final String REG_MOBILEPHONE = "^1(3[0-9]|4[57]|5[0-35-9]|7[0135678]|8[0-9])\\d{8}$";
    /**
     * 验证邮箱的正则
     */
    public static final String REG_EMAIL = "^(\\w)+(\\.\\w+)*@(\\w)+((\\.\\w+)+)$";

    /**
     * 预编译正则对象，该方法采用内存缓存提高预编译效率，对首次使用的表达式进行缓存
     *
     * @param regex 正则字符串
     * @param flags 匹配模式
     */
    public static Pattern preCompilePattern(String regex, Integer flags) {
        // 创建缓存key
        String key = regex;
        if (null != flags) {
            key += (LINK_TAG + flags);
        }
        Pattern pattern = PRE_COMPILE_REGEX_MAP.get(key);
        // 如果未发现预编译正则表达式，则进行创建并缓存
        if (null == pattern) {
            pattern = (null == flags) ? Pattern.compile(regex) : Pattern.compile(regex, flags);
            PRE_COMPILE_REGEX_MAP.put(key, pattern);
        }
        return pattern;
    }

    /**
     * 预编译正则对象，区分大小写
     */
    public static Pattern preCompilePattern(String regex) {
        return preCompilePattern(regex, null);
    }

    /**
     * 预编译正则对象，不区分大小写
     */
    public static Pattern preCompilePatternIgnoreCase(String regex) {
        return preCompilePattern(regex, Pattern.CASE_INSENSITIVE);
    }

    /**
     * 验证正则，如果某一regex或者cs为空，返回false，两者都为空返回ture
     *
     * @param regex  正则字符串
     * @param cs     待验证字符串
     * @param iscase 是否区分大小写
     * @return 通过返回true，失败返回false
     */
    public static boolean match(String regex, CharSequence cs, boolean iscase) {
        if (null == regex || null == cs) {
            if (regex == cs) {
                return true;
            }
            return false;
        }
        Pattern pattern = iscase ? preCompilePattern(regex) : preCompilePattern(regex, Pattern.CASE_INSENSITIVE);
        return pattern.matcher(cs).matches();
    }

    /**
     * 验证正则，区分大小写，如果某一regex或者cs为空，返回false，两者都为空返回ture
     *
     * @param regex 正则字符串
     * @param cs    待验证字符串
     * @return 通过返回true，失败返回false
     */
    public static boolean match(String regex, CharSequence cs) {
        return match(regex, cs, true);
    }

}
